package main

import (
	"fmt"
)
/*
长度超过8位
包括：大写小写字母数字其他符号，以上四种至少有三种
不能有长度超过或等于3的子串重复
密码的评分等级，默认2分，以上条件满足加一分’
返回密码的评分等级，以及要改进的点
如：return 3 ["长度小于8"， 密码没有由三种以上字符组成]
*/
var score int = 2
var passwd string
var p * int = &score
func main(){

	//密码长度验证
	passwd_len(&score)
	//不能有长度超过或等于3的子串重复
	repeat_str(passwd, &score)
	//大写小写字母数字其他符号，以上四种至少有三种
	check_kind(passwd,&score)
	//返回密码分数，要改进的点
	fmt.Println(score)
}

//密码长度验证
func passwd_len(p * int){
	fmt.Println("please input your passwd:")
	fmt.Scan(&passwd)
	if len(passwd) <= 8{
		fmt.Println("你的密码长度小于8")
		score --
	}else{
		score ++
	}


}
//不能有长度超过或等于3的子串重复
func repeat_str(passwd string, p * int )  {
	var i int
	var j int
	var c int
	c = 0
	for i=0 ; i<len(passwd)-3 ; i++{
		for j=1 ;j<len(passwd)-3;j++{
			if passwd[i:i+3] == passwd[j:j+3]{
				fmt.Println("有长度超过或等于3的子串重复")
				c = 1

				break
			}else {


			}
		}
	if c == 1 {
		score --
		break
	}
	}
}
//密码包括大写字母小写字母数字其他符号，至少三种

func check_kind(passwd string,p * int) {
	var flag1 int = 0
	var flag2 int = 0
	var flag3 int = 0
	var flag4 int =0
		for i :=0; i < len(passwd); i++ {
			switch {
			case 64 < passwd[i] && passwd[i] < 91:
				flag1 = 1
				//fmt.Println("有大写字母")
			case 96 < passwd[i] && passwd[i] < 123:
				flag2 = 1
				//fmt.Println("有小写字母")
			case 47 < passwd[i] && passwd[i] < 58:
				flag3 = 1
				//fmt.Println("有数字")
			default:
				flag4 = 1
				//fmt.Println("有其他字符")
			}
		}
		if flag1 == 1 && flag2 == 1 && flag3==1{
			fmt.Println("包括大写字母小写字母数字")
			score ++
		}else if flag1 == 1 && flag2 == 1 && flag4 == 1{
			fmt.Println("包括大写字母小写字母数字")
			score ++
		}else if flag1 == 1 && flag3==1 && flag4 == 1{
			fmt.Println("包括大写字母小写字母数字")
			score ++
		}else if flag2 == 1 && flag3==1 && flag4 == 1 {
			fmt.Println("包括大写字母小写字母数字")
			score++
		}else if flag2 == 1 && flag3==1 && flag4 == 1 && flag4 == 1{
			fmt.Println("包括大写字母小写字母数字")
			score++
		}

	}





